ํจ์จ์ ์ธ ๋๋ฒ๊น ๊ณผ ์ต์ ํ๋ฅผ ์ํ WebGL ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ๊ธฐ์ ์ ํ์ํ์ธ์. ์ ๋ํผ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ ๊ธฐํ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์ฟผ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์ต๋๋ค.
WebGL ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์ฟผ๋ฆฌ: ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ๋ฐ ๋๋ฒ๊น
WebGL์ ํธํ๋๋ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ๋ด์์ ๋ํํ 2D ๋ฐ 3D ๊ทธ๋ํฝ์ ๋ ๋๋งํ๊ธฐ ์ํ ๊ฐ๋ ฅํ JavaScript API๋ก, GLSL(OpenGL Shading Language)๋ก ์์ฑ๋ ์ ฐ์ด๋์ ํฌ๊ฒ ์์กดํฉ๋๋ค. ์ด๋ฌํ ์ ฐ์ด๋๊ฐ ์ด๋ป๊ฒ ์๋ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ํธ ์์ฉํ๋์ง ์ดํดํ๋ ๊ฒ์ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์๊ฐ์ ์ถฉ์ค๋๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด๋ ์ข ์ข ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ (shader introspection)์ผ๋ก ์๋ ค์ง ๊ณผ์ ์ธ ์ ฐ์ด๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ WebGL ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ๊ธฐ์ ๊ณผ ์ ๋ต์ ๊น์ด ์๊ฒ ๋ค๋ฃจ์ด, ์ ฐ์ด๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋๋ฒ๊น , ์ต์ ํ ๋ฐ ๊ด๋ฆฌํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ ๋ํผ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ ๊ธฐํ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ์ํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ธ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์ํ ์ง์์ ์ ๊ณตํ ๊ฒ์ ๋๋ค.
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ด ์ค์ํ ์ด์
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ GLSL ์ ฐ์ด๋์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ๋ค์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ์ ฐ์ด๋ ๋ฌธ์ ๋๋ฒ๊น : ์๋ชป๋ ์ ๋ํผ ๊ฐ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ธ๋ฉ ๋ฐ ๊ธฐํ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ๊ด๋ จ๋ ์ค๋ฅ๋ฅผ ์๋ณํ๊ณ ํด๊ฒฐํฉ๋๋ค.
- ์ ฐ์ด๋ ์ฑ๋ฅ ์ต์ ํ: ์ ฐ์ด๋ ์ฌ์ฉ์ ๋ถ์ํ์ฌ ์ฌ์ฉ๋์ง ์๋ ์ ๋ํผ์ด๋ ๋นํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ๋ฆ๊ณผ ๊ฐ์ ์ต์ ํ ์์ญ์ ์๋ณํฉ๋๋ค.
- ๋์ ์ ฐ์ด๋ ๊ตฌ์ฑ: ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ ๋ํผ ๊ฐ์ ์ฟผ๋ฆฌํ๊ณ ์์ ํ์ฌ ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ฐ์ด๋ ๋์์ ์กฐ์ ํฉ๋๋ค.
- ์๋ํ๋ ์ ฐ์ด๋ ๊ด๋ฆฌ: ์ ์ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋์ผ๋ก ๋ฐ๊ฒฌํ๊ณ ๊ตฌ์ฑํ์ฌ ์ ฐ์ด๋ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์ดํดํ๊ธฐ
์ธํธ๋ก์คํ์ ๊ธฐ์ ์ ์ดํด๋ณด๊ธฐ ์ ์, ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃฐ ์ฃผ์ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ช ํํ ํด๋ณด๊ฒ ์ต๋๋ค:
- ์ ๋ํผ(Uniforms): ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ์์ ๋ ์ ์๋ ์ ฐ์ด๋ ๋ด์ ์ ์ญ ๋ณ์์ ๋๋ค. ํ๋ ฌ, ์์, ํ ์ค์ฒ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ฐ์ด๋์ ์ ๋ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ดํธ๋ฆฌ๋ทฐํธ(Attributes): ๋ฒํ ์ค ๋ฒํผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋ฒํ ์ค ์ ฐ์ด๋์ ์ ๋ ฅ ๋ณ์์ ๋๋ค. ์ง์ค๋ฉํธ๋ฆฌ ๋ฐ ๊ธฐํ ๋ฒํ ์ค๋ณ ์์ฑ์ ์ ์ํฉ๋๋ค.
- ๋ฒ ์ด๋ง(Varyings): ๋ฒํ ์ค ์ ฐ์ด๋์์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ณ์์ ๋๋ค. ๋ ๋๋ง๋๋ ํ๋ฆฌ๋ฏธํฐ๋ธ์ ๊ฑธ์ณ ๋ณด๊ฐ๋ฉ๋๋ค.
- ์ํ๋ฌ(Samplers): ํ ์ค์ฒ๋ฅผ ๋ํ๋ด๋ ํน๋ณํ ์ ํ์ ์ ๋ํผ์ ๋๋ค. ์ ฐ์ด๋ ๋ด์์ ํ ์ค์ฒ ๋ฐ์ดํฐ๋ฅผ ์ํ๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ ์ฟผ๋ฆฌ๋ฅผ ์ํ WebGL API
WebGL์ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ธฐ ์ํ ์ฌ๋ฌ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํจ์๋ค์ ์ฌ์ฉํ๋ฉด ์ ๋ํผ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ ๊ธฐํ ์ ฐ์ด๋ ์์ฑ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ ๋ํผ ์ฟผ๋ฆฌํ๊ธฐ
๋ค์ ํจ์๋ ์ ๋ํผ ์ ๋ณด๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค:
- `gl.getUniformLocation(program, name)`: ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๋ด์์ ์ ๋ํผ ๋ณ์์ ์์น๋ฅผ ๊ฐ์ ธ์ต๋๋ค. `program` ์ธ์๋ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ด๊ณ `name`์ GLSL ์ ฐ์ด๋์ ์ ์ธ๋ ์ ๋ํผ ๋ณ์์ ์ด๋ฆ์ ๋๋ค. ์ ๋ํผ์ ์ฐพ์ ์ ์๊ฑฐ๋ ๋นํ์ฑ ์ํ(์ ฐ์ด๋ ์ปดํ์ผ๋ฌ์ ์ํด ์ต์ ํ๋์ด ์ ๊ฑฐ๋จ)์ธ ๊ฒฝ์ฐ `null`์ ๋ฐํํฉ๋๋ค.
- `gl.getActiveUniform(program, index)`: ํน์ ์ธ๋ฑ์ค์ ์๋ ํ์ฑ ์ ๋ํผ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. `program` ์ธ์๋ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ด๊ณ `index`๋ ์ ๋ํผ์ ์ธ๋ฑ์ค์ ๋๋ค. ์ ๋ํผ์ ์ด๋ฆ, ํฌ๊ธฐ, ์ ํ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ WebGLActiveInfo ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- `gl.getProgramParameter(program, pname)`: ํ๋ก๊ทธ๋จ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค. ํนํ ํ์ฑ ์ ๋ํผ์ ์(`gl.ACTIVE_UNIFORMS`)์ ์ ๋ํผ ์ด๋ฆ์ ์ต๋ ๊ธธ์ด(`gl.ACTIVE_UNIFORM_MAX_LENGTH`)๋ฅผ ์ป๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- `gl.getUniform(program, location)`: ์ ๋ํผ ๋ณ์์ ํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค. `program` ์ธ์๋ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ด๊ณ `location`์ ์ ๋ํผ์ ์์น์ ๋๋ค(`gl.getUniformLocation`์ ์ฌ์ฉํ์ฌ ์ป์). ์ด ํจ์๋ ํน์ ์ ๋ํผ ์ ํ์๋ง ์๋ํ๋ฉฐ ๋ชจ๋ ๋๋ผ์ด๋ฒ์์ ์ ๋ขฐํ ์ ์์ ์ ์์ต๋๋ค.
์์ : ์ ๋ํผ ์ ๋ณด ์ฟผ๋ฆฌํ๊ธฐ
// gl์ด ์ ํจํ WebGLRenderingContext์ด๊ณ program์ด ์ปดํ์ผ ๋ฐ ๋งํฌ๋ WebGLProgram์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
for (let i = 0; i < numUniforms; i++) {
const uniformInfo = gl.getActiveUniform(program, i);
if (uniformInfo) {
const name = uniformInfo.name;
const type = uniformInfo.type;
const size = uniformInfo.size;
const location = gl.getUniformLocation(program, name);
console.log(`์ ๋ํผ ${i}:`);
console.log(` ์ด๋ฆ: ${name}`);
console.log(` ํ์
: ${type}`);
console.log(` ํฌ๊ธฐ: ${size}`);
console.log(` ์์น: ${location}`);
// ์ด์ ์ด ์์น(location)๋ฅผ ์ฌ์ฉํ์ฌ gl.uniform* ํจ์๋ก ์ ๋ํผ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
}
}
์ดํธ๋ฆฌ๋ทฐํธ ์ฟผ๋ฆฌํ๊ธฐ
๋ค์ ํจ์๋ ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค:
- `gl.getAttribLocation(program, name)`: ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๋ด์์ ์ดํธ๋ฆฌ๋ทฐํธ ๋ณ์์ ์์น๋ฅผ ๊ฐ์ ธ์ต๋๋ค. `program` ์ธ์๋ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ด๊ณ `name`์ GLSL ์ ฐ์ด๋์ ์ ์ธ๋ ์ดํธ๋ฆฌ๋ทฐํธ ๋ณ์์ ์ด๋ฆ์ ๋๋ค. ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฐพ์ ์ ์๊ฑฐ๋ ๋นํ์ฑ ์ํ์ธ ๊ฒฝ์ฐ -1์ ๋ฐํํฉ๋๋ค.
- `gl.getActiveAttrib(program, index)`: ํน์ ์ธ๋ฑ์ค์ ์๋ ํ์ฑ ์ดํธ๋ฆฌ๋ทฐํธ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. `program` ์ธ์๋ WebGL ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ด๊ณ `index`๋ ์ดํธ๋ฆฌ๋ทฐํธ์ ์ธ๋ฑ์ค์ ๋๋ค. ์ดํธ๋ฆฌ๋ทฐํธ์ ์ด๋ฆ, ํฌ๊ธฐ, ์ ํ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ WebGLActiveInfo ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- `gl.getProgramParameter(program, pname)`: ํ๋ก๊ทธ๋จ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค. ํนํ ํ์ฑ ์ดํธ๋ฆฌ๋ทฐํธ์ ์(`gl.ACTIVE_ATTRIBUTES`)์ ์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ์ ์ต๋ ๊ธธ์ด(`gl.ACTIVE_ATTRIBUTE_MAX_LENGTH`)๋ฅผ ์ป๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์ : ์ดํธ๋ฆฌ๋ทฐํธ ์ ๋ณด ์ฟผ๋ฆฌํ๊ธฐ
// gl์ด ์ ํจํ WebGLRenderingContext์ด๊ณ program์ด ์ปดํ์ผ ๋ฐ ๋งํฌ๋ WebGLProgram์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
for (let i = 0; i < numAttributes; i++) {
const attribInfo = gl.getActiveAttrib(program, i);
if (attribInfo) {
const name = attribInfo.name;
const type = attribInfo.type;
const size = attribInfo.size;
const location = gl.getAttribLocation(program, name);
console.log(`์ดํธ๋ฆฌ๋ทฐํธ ${i}:`);
console.log(` ์ด๋ฆ: ${name}`);
console.log(` ํ์
: ${type}`);
console.log(` ํฌ๊ธฐ: ${size}`);
console.log(` ์์น: ${location}`);
// ์ด์ ์ด ์์น(location)๋ฅผ ์ฌ์ฉํ์ฌ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ฒํ
์ค ๋ฒํผ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค.
}
}
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ค์ ์ ์ฉ ์ฌ๋ก
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ WebGL ๊ฐ๋ฐ์์ ์๋ง์ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๊ฐ์ง๋๋ค:
๋์ ์ ฐ์ด๋ ๊ตฌ์ฑ
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ฌ์ฉํ์ฌ ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ฐ์ด๋๋ฅผ ๋์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ํผ์ ์ ํ์ ์ฟผ๋ฆฌํ ๋ค์ ๊ทธ์ ๋ฐ๋ผ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ปดํ์ผ ์์ด๋ ๋ค์ํ ์ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ๋ ์ ์ฐํ๊ณ ์ ์ ๊ฐ๋ฅํ ์ ฐ์ด๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์์ : ๋์ ์ ๋ํผ ์ค์
// gl์ด ์ ํจํ WebGLRenderingContext์ด๊ณ program์ด ์ปดํ์ผ ๋ฐ ๋งํฌ๋ WebGLProgram์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
const location = gl.getUniformLocation(program, "myUniform");
const numUniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
let uniformType = null;
for (let i = 0; i < numUniforms; i++) {
const uniformInfo = gl.getActiveUniform(program, i);
if (uniformInfo && uniformInfo.name === "myUniform") {
uniformType = uniformInfo.type;
break;
}
}
if (location !== null && uniformType !== null) {
if (uniformType === gl.FLOAT) {
gl.uniform1f(location, 1.0);
} else if (uniformType === gl.FLOAT_VEC3) {
gl.uniform3f(location, 1.0, 0.5, 0.2);
} else if (uniformType === gl.SAMPLER_2D) {
// ํ
์ค์ฒ ์ ๋ 0์ด ์ด๋ฏธ ํ
์ค์ฒ์ ๋ฐ์ธ๋ฉ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
gl.uniform1i(location, 0);
}
// ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ์ ๋ํผ ์ ํ์ ๋ํ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
}
์๋ํ๋ ์ ฐ์ด๋ ๋ฐ์ธ๋ฉ
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ๋ฒํ ์ค ๋ฒํผ์ ๋ฐ์ธ๋ฉํ๋ ๊ณผ์ ์ ์๋ํํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ดํธ๋ฆฌ๋ทฐํธ์ ์ด๋ฆ๊ณผ ์์น๋ฅผ ์ฟผ๋ฆฌํ ๋ค์, ๋ฒํ ์ค ๋ฒํผ์ ํด๋น ๋ฐ์ดํฐ์ ์๋์ผ๋ก ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. ์ด๋ ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๋จ์ํํ๊ณ ์ค๋ฅ์ ์ํ์ ์ค์ ๋๋ค.
์์ : ์๋ํ๋ ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ์ธ๋ฉ
// gl์ด ์ ํจํ WebGLRenderingContext์ด๊ณ program์ด ์ปดํ์ผ ๋ฐ ๋งํฌ๋ WebGLProgram์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
const positions = new Float32Array([ ... ]); // ๋ฒํ
์ค ์์น ๋ฐ์ดํฐ
const colors = new Float32Array([ ... ]); // ๋ฒํ
์ค ์์ ๋ฐ์ดํฐ
// ์์น๋ฅผ ์ํ ๋ฒํ
์ค ๋ฒํผ ์์ฑ
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
// ์์์ ์ํ ๋ฒํ
์ค ๋ฒํผ ์์ฑ
const colorBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
const numAttributes = gl.getProgramParameter(program, gl.ACTIVE_ATTRIBUTES);
for (let i = 0; i < numAttributes; i++) {
const attribInfo = gl.getActiveAttrib(program, i);
if (attribInfo) {
const name = attribInfo.name;
const location = gl.getAttribLocation(program, name);
if (name === "a_position") {
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(location, 3, gl.FLOAT, false, 0, 0); // ์์น์ 3๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์
gl.enableVertexAttribArray(location);
} else if (name === "a_color") {
gl.bindBuffer(gl.ARRAY_BUFFER, colorBuffer);
gl.vertexAttribPointer(location, 4, gl.FLOAT, false, 0, 0); // ์์(RGBA)์ 4๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ์๋ค๊ณ ๊ฐ์
gl.enableVertexAttribArray(location);
}
// ํ์์ ๋ฐ๋ผ ๋ค๋ฅธ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ํ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
}
}
์ ฐ์ด๋ ๋ฌธ์ ๋๋ฒ๊น
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ ฐ์ด๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ๊ฐ ๋ ์ ์์ต๋๋ค. ์ ๋ํผ๊ณผ ์ดํธ๋ฆฌ๋ทฐํธ์ ๊ฐ์ ์ฟผ๋ฆฌํ์ฌ ๋ฐ์ดํฐ๊ฐ ์ ฐ์ด๋์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๊ณ ์๋์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ์ ํ๊ณผ ํฌ๊ธฐ๋ฅผ ํ์ธํ์ฌ ์์๊ณผ ์ผ์นํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ ฐ์ด๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋์ง ์๋ ๊ฒฝ์ฐ, ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ-๋ทฐ-ํ๋ก์ ์ ํ๋ ฌ ์ ๋ํผ์ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค. ํ๋ ฌ์ด ์๋ชป๋ ๊ฒฝ์ฐ ๋ฌธ์ ์ ์์ธ์ ์๋ณํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
WebGL2์์์ ์ ฐ์ด๋ ์ธํธ๋ก์คํ์
WebGL2๋ WebGL1์ ๋นํด ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ํ ๋ ๋ฐ์ ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ํจ์๋ ๋์ผํ๊ฒ ์ ์ง๋์ง๋ง, WebGL2๋ ๋ ๋์ ์ฑ๋ฅ๊ณผ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebGL2์ ์ค์ํ ์ฅ์ ์ค ํ๋๋ ์ ๋ํผ ๋ธ๋ก์ ๊ฐ์ฉ์ฑ์ ๋๋ค. ์ ๋ํผ ๋ธ๋ก์ ์ฌ์ฉํ๋ฉด ๊ด๋ จ ์ ๋ํผ์ ํจ๊ป ๊ทธ๋ฃนํํ ์ ์์ด ๊ฐ๋ณ ์ ๋ํผ ์ ๋ฐ์ดํธ ํ์๋ฅผ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. WebGL2์ ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ฌ์ฉํ๋ฉด ์ ๋ํผ ๋ธ๋ก์ ํฌ๊ธฐ ๋ฐ ๋ฉค๋ฒ์ ์คํ์ ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ฟผ๋ฆฌํ ์ ์์ต๋๋ค.
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ฌ์ฉํ ๋ ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ธํธ๋ก์คํ์ ์ค๋ฒํค๋ ์ต์ํ: ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ๋น๊ต์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ผ ์ ์์ต๋๋ค. ํนํ ๋ ๋๋ง ๋ฃจํ ๋ด์์ ๋ถํ์ํ๊ฒ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๊ฒ์ ํผํ์ธ์. ์ธํธ๋ก์คํ์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๊ณ ๊ฐ๋ฅํ ๋๋ง๋ค ์ฌ์ฌ์ฉํ์ธ์.
- ์ฐ์ํ ์ค๋ฅ ์ฒ๋ฆฌ: ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ ๋ ์ค๋ฅ๋ฅผ ํ์ธํ์ธ์. ์๋ฅผ ๋ค์ด, `gl.getUniformLocation`์ ์ ๋ํผ์ ์ฐพ์ง ๋ชปํ๋ฉด `null`์ ๋ฐํํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถฉ๋ํ์ง ์๋๋ก ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ์ธ์.
- ์๋ฏธ ์๋ ์ด๋ฆ ์ฌ์ฉ: ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ์ค๋ช ์ ์ด๊ณ ์๋ฏธ ์๋ ์ด๋ฆ์ ์ฌ์ฉํ์ธ์. ์ด๋ ๊ฒ ํ๋ฉด ์ ฐ์ด๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
- ๋์ ๊ณ ๋ ค: ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ด ์ ์ฉํ์ง๋ง, WebGL ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ ฐ์ด๋ ์ถ๋ ฅ์ ๋ก๊น ํ๋ ๋ฑ ๋ค๋ฅธ ๋๋ฒ๊น ๊ธฐ์ ๋ ๊ณ ๋ คํ์ธ์.
๊ณ ๊ธ ๊ธฐ์
WebGL ๋๋ฒ๊ฑฐ ์ฌ์ฉ
WebGL ๋๋ฒ๊ฑฐ๋ ์ ๋ํผ, ์ดํธ๋ฆฌ๋ทฐํธ ๋ฐ ๊ธฐํ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ํฌํจํ์ฌ ์ ฐ์ด๋ ์ํ์ ๋ํ ๋ ํฌ๊ด์ ์ธ ๋ทฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋๋ฒ๊ฑฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ฐ์ด๋ ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๊ณ , ๋ณ์๋ฅผ ๊ฒ์ฌํ๋ฉฐ, ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ์๋ณํ ์ ์์ต๋๋ค.
์ธ๊ธฐ ์๋ WebGL ๋๋ฒ๊ฑฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- Spector.js: ๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ ์๋ ๋ฌด๋ฃ ์คํ ์์ค WebGL ๋๋ฒ๊ฑฐ์ ๋๋ค.
- RenderDoc: ๊ฐ๋ ฅํ ์คํ ์์ค ๋ ๋ฆฝํ ๊ทธ๋ํฝ ๋๋ฒ๊ฑฐ์ ๋๋ค.
- Chrome ๊ฐ๋ฐ์ ๋๊ตฌ (์ ํ์ ): Chrome์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ์ผ๋ถ WebGL ๋๋ฒ๊น ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ ฐ์ด๋ ๋ฆฌํ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฌ๋ฌ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ ์ํ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ฐ์ด๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๊ณผ์ ์ ๋จ์ํํ๊ณ ์ ฐ์ด๋ ์ ๋ณด์ ๋ ํธ๋ฆฌํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๋๋ฆฌ ์ฑํ๋๊ณ ์ ์ง ๊ด๋ฆฌ๋์ง ์์ผ๋ฏ๋ก ํ๋ก์ ํธ์ ์ ํฉํ ์ ํ์ธ์ง ์ ์คํ๊ฒ ํ๊ฐํด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก
WebGL ์ ฐ์ด๋ ์ธํธ๋ก์คํ์ ์ GLSL ์ ฐ์ด๋๋ฅผ ๋๋ฒ๊น , ์ต์ ํ ๋ฐ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ ๋ํผ ๋ฐ ์ดํธ๋ฆฌ๋ทฐํธ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ ๋ ๊ฒฌ๊ณ ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์ ์ ๊ฐ๋ฅํ WebGL ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. WebGL ๊ฐ๋ฐ์ ๋ํ ๊ท ํ ์กํ ์ ๊ทผ์ ์ํด ์ธํธ๋ก์คํ์ ์ ํ๋ช ํ๊ฒ ์ฌ์ฉํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ฉฐ, ๋์ฒด ๋๋ฒ๊น ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ์ด ์ง์์ ๋ณต์กํ ๋ ๋๋ง ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์๊ฐ์ ์ผ๋ก ๋ฉ์ง ์น ๊ธฐ๋ฐ ๊ทธ๋ํฝ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ํ์ ์ค์ด์ค ๊ฒ์ ๋๋ค.